// 给你一个正整数 n ，生成一个包含 1 到 n方 所有元素，
// 且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

const generateMatrix = function (n: number): number[][] {
    let leftBound = 0;
    let rightBound = n - 1;
    let topBound = 0;
    let bottomBound = n - 1;
    let currNum = 1;
    const end = n ** 2;
    // 初始化矩阵
    const matrix: number[][] = new Array(n).fill(0).map(() => new Array(n).fill(0));
    // 顺时针遍历赋值
    while (currNum <= end) {
        // 从左至右
        for (let i = leftBound; i <= rightBound; i++) {
            matrix[topBound][i] = currNum;
            currNum++;
        }
        topBound++;
        // 从上至下
        for (let i = topBound; i <= bottomBound; i++) {
            matrix[i][rightBound] = currNum;
            currNum++;
        }
        rightBound--;
        // 从右至左
        for (let i = rightBound; i >= leftBound; i--) {
            matrix[bottomBound][i] = currNum;
            currNum++;
        }
        bottomBound--;
        // 从下至上
        for (let i = bottomBound; i >= topBound; i--) {
            matrix[i][leftBound] = currNum;
            currNum++;
        }
        leftBound++;
    }
    return matrix;
};


// 这道题目找到方法的难度并不大
// 相信大家会想到这里的关键点在于如何顺时针遍历一个矩阵
// 而这里的方法是首先设置四个矩阵上下左右的边界值
// 其次设置主循环次数终点方便结束遍历
// 然后内部需要设置四个方向的循环，依次分别是：从左往右，从上往下，从右往左，从下往上
// 每一轮次循环走完后都需要更新边界值，所有次循环走完后就回到主循环判断是否出口
// 找到矩阵顺时针遍历方法后这道题目就迎刃而解